package com.aaa.wash.service.impl;

import com.aaa.common.constant.ConstantUtil;
import com.aaa.common.entity.Pay;
import com.aaa.common.util.HttpClient;
import com.aaa.wash.service.PayService;
import com.github.wxpay.sdk.WXPayUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * @ FileName: PayServiceImpl
 * @ Description:
 * @ Author:  STB
 * @ CreateTime: 2025/10/10 0010 10:51
 * @ Version: 1.0.0
 */
@Service
@Log4j2
public class PayServiceImpl implements PayService {
    @Override
    public Map getPayStatus(String detailNo) {
        try {
            Map paramMap = new HashMap();
            //参数
            paramMap.put("appid", ConstantUtil.PayConfig.APPID);
            paramMap.put("mch_id", ConstantUtil.PayConfig.MCH_ID);//"1558950191"
            paramMap.put("out_trade_no", detailNo+"");
            //1.00    1
            //m.put("total_fee", new BigDecimal(order.getPrice()*order.getNum()).multiply(new BigDecimal("100")).longValue() + ""); //单位 分
            paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
            //m.put("sign", "127.0.0.1");
            //m.put("trade_type", "NATIVE");
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            client.setXmlParam(WXPayUtil.generateSignedXml(paramMap, ConstantUtil.PayConfig.API_KEY));
            client.setHttps(true);
            client.post();
            String xml = client.getContent();//xml
            System.out.println("支付后的信息========" + xml);
            //System.out.println("支付后的信息========" + xml);
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            System.out.println("支付之后的信息的内容==================="+resultMap);
            return resultMap;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Map getNativeByOrder(Pay pay) {
        try {
            // 1. 参数校验（新增参数非空校验）
            if (pay.getRechargeMoney() == null || pay.getUserId() == null || pay.getStoreId() == null) {
                log.error("必要参数缺失：rechargeMoney/userId/storeId 不能为空");
                return null; // 或返回错误信息
            }

            // 2. 业务逻辑处理（示例）
            // 2.1 计算实际支付金额（示例：充值金额 - 折扣金额）
            BigDecimal recharge = new BigDecimal(pay.getRechargeMoney());
            BigDecimal discounts = new BigDecimal(pay.getDiscountsMoney() == null ? "0" : pay.getDiscountsMoney());
            BigDecimal actualMoney = recharge.subtract(discounts).setScale(2, BigDecimal.ROUND_HALF_UP);

            // 2.2 生成订单号（示例：使用userId+时间戳）
            String detailNo = pay.getDetailId();
            pay.setDetailNo(detailNo); // 设置订单号到Pay对象

            // 2.3 设置商品描述（示例：使用门店ID和详情ID）
            String describe = "门店[" + pay.getStoreId() + "]-订单[" + pay.getDetailId() + "]";
            pay.setDescribe(describe);

            // 3. 微信支付参数组装（复用原有逻辑，使用处理后的值）
            Map paramMap = new HashMap();
            paramMap.put("appid", ConstantUtil.PayConfig.APPID); // 修复参数名（原APP_ID改为"appid"）
            paramMap.put("mch_id", ConstantUtil.PayConfig.MCH_ID);
            paramMap.put("out_trade_no", pay.getDetailNo()); // 使用生成的订单号
            paramMap.put("total_fee", actualMoney.multiply(new BigDecimal("100")).longValue() + ""); // 转为分
            paramMap.put("body", pay.getDescribe()); // 使用组装的描述
            paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
            paramMap.put("spbill_create_ip", "127.0.0.1");
            paramMap.put("trade_type", "NATIVE");
            paramMap.put("notify_url", "http://www.chenkaixiang.top/notifyWeiXinPay"); // 移除换行符
            //统一下单
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            client.setXmlParam(WXPayUtil.generateSignedXml(paramMap, ConstantUtil.PayConfig.API_KEY));
            client.setHttps(true);
            client.post();
            //生成的预支付订单的消息
            String xml = client.getContent();//xml
            System.out.println("-------------" + xml);
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            System.out.println(resultMap);
            Map returnMap = new HashMap<>();
            //map.put("out_trade_no", orederNum);
            //map.put("course_id", 1);
            //map.put("total_fee", 1 + "");
            //map.put("result_code", resultMap.get("result_code"));
            returnMap.put("code_url", resultMap.get("code_url"));
            return returnMap;
        } catch (Exception e) {
            // System.out.println(e.getMessage());
            log.error(e.getMessage());
        }
        return null;
    }

}
